#include "parser.h"
#include <cstdio>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <cstring>



bool makeDirList (const char * path, vector<string> & dir_list );


int main (int argc, char *argv[])
{

    time_t t_begin = 0;
    time_t t_end = 0;
    vector<string> dir_list;
    t_begin = time(NULL);                         //вектор стандартных лексем языка с++
    vector<string> temp_vector;
    FILE * file = fopen("./en_GB.dic", "r");
    Parser P(file);
    fclose(file);
    FILE * added_words = fopen("./ident","r");   //добавляем стандартные лексемы с++ в словарь
    char a_current_word [1024];
    string a_temp_word;
    while(!feof(added_words))
    {
        fgets(a_current_word, 1024, added_words);
        a_temp_word.clear();
        size_t i = 0;
        for(i=0; (a_current_word[i] != '/')&&(a_current_word[i] != '\t')&&(a_current_word[i] != '\n')&&(a_current_word[i] != '\0'); ++i)
        {
            a_temp_word.push_back(a_current_word[i]);
        }
        temp_vector.push_back(a_temp_word);
    }
    FILE * heders_words = fopen("./includes","r");
    if(heders_words)
    {
    	while(!feof(heders_words))
		{
			fgets(a_current_word, 1024, heders_words);
			a_temp_word.clear();
			size_t i = 0;
			for(i=0; (a_current_word[i] != '/')&&(a_current_word[i] != '\t')&&(a_current_word[i] != '\n')&&(a_current_word[i] != '\0'); ++i)
			{
				a_temp_word.push_back(a_current_word[i]);
			}
			temp_vector.push_back(a_temp_word);
		}
    }
    P.D_.addToDict(temp_vector);


    /*В качестве параметра передаем либо имя файла либо имя директории
    *если директория, то обрабатываем файлы из нее по очереди */
    if(!strcmp(argv[1] , "-dir"))
    {
        for(int i = 0; i < argc-2; ++i)  //т.к. первые 2 параметра не имена файлов или дирректорий
        {
            makeDirList(argv[i+2], dir_list);
        }

        while(!dir_list.empty())
        {
            string file_name = dir_list.back();
            dir_list.pop_back();
            if(((file_name.find(".cpp"))!=string::npos) || ((file_name.find(".h"))!=string::npos))
            {
                FILE * input_file = fopen (file_name.data(),"r");
                if (input_file != NULL)
                {
                    P.setInputFile (input_file, file_name.data());
                }
                else
                {
                    printf("Input  file <%s> not open\n",file_name.data());
                }
                P.runParser();
                fclose(input_file);
            }
        }
    }

    if(!strcmp(argv[1] , "-file"))
    {
        for(int i = 0; i < argc-2; ++i)
        {
            FILE * input_file = fopen (argv[i+2],"r");
            if (input_file != NULL)
            {
                P.setInputFile (input_file, string(argv[i+2]).data());
            }
            else
            {
                printf("Input  file <%s> not open\n",argv[i+2]);
            }
            P.runParser();
            fclose(input_file);
        }
    }
    
    if(!strcmp(argv[1] , "-ah"))
    {
    	for(int i = 0; i < argc-2; ++i)
        {
            makeDirList(argv[i+2], dir_list);
        }
        while(!dir_list.empty())
        {
		  		set <string> ident_in_includes;
		      string file_name = dir_list.back();
		      dir_list.pop_back();
		      if((file_name.find(".h"))!=string::npos)                 //А если не только .h? все ли файлы там хэдеры?
		      {
					 FILE * input_file = fopen (file_name.data(),"r");
					 if (input_file != NULL)
					 {
						  P.setInputFile (input_file, file_name.data());
					 }
					 else
					 {
						  printf("Input  file <%s> not open\n",file_name.data());
					 }
					 //printf("in main\n");
					 P.notPrintError();
					 //printf("in main\n");
					 ident_in_includes = P.runParser();
					 //P.runParser();
					 printf("make set\n");
					 fclose(input_file);
					 FILE * includes = fopen("./includes", "a+");                                                 //сначала стереть все что было?
					 for(set<string>:: iterator it = ident_in_includes.begin(); it != ident_in_includes.end(); ++it)
					 {
					  	fprintf(includes, "%s\n", (*it).data());
					 }
		      }
		  }
    }
    
    t_end = time(NULL);
    printf("Work time = %ld seconds\n", t_end - t_begin);
    return 1;
}



bool makeDirList (const char * path, vector<string> & dir_list)  //получаем список полных путей к файлам в дирректории
{
    DIR  *dip = NULL;
    struct dirent *dit = NULL;
    string temp_name(path);
    if ((dip = opendir(path)) == NULL)
    {
        printf("Directory stream is not open\n");
        return 0;
    }
    else
    {
        while ((dit = readdir(dip))!= NULL)
        {
            string name_dir = dit->d_name;
            if((dit->d_type == DT_DIR) && (name_dir!=string("."))&&(name_dir!=string("..")) && (name_dir!=string(".svn")))
            {
                name_dir = temp_name + string("/") + name_dir;
                makeDirList(name_dir.data(),dir_list);
            }
            else
            {
                dir_list.push_back(dit->d_name);
            }
        }
    }
    return true;
}



















